#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDir>
#include <QFileDialog>
#include <QDebug>
#include <QCoreApplication>
#include <QVector>
#include "dwgline.h"
#include "dwgcircle.h"
#include "dwgrectangle.h"
#include "dwgpoint.h"
#include "dwgobject.h"
#include<QMouseEvent>
QStringList m_MainList;
bool isFirst = true;
QPoint temppt;
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->NewRB->setDefaultAction(ui->actionNew);
    ui->OpenRB->setDefaultAction(ui->actionOpen);
    ui->SaveRB->setDefaultAction(ui->actionSave);
    ui->Save_asRB->setDefaultAction(ui->actionSaveAs);
    ui->ExitRB->setDefaultAction(ui->actionExit);
        //实现DrawTB子页面的按钮
    QHBoxLayout *drawHL1 = new QHBoxLayout;               // 我们先设计一个横排列的布局，用于排列绘图控件
    drawHL1->setAlignment(Qt::AlignLeft);					//  左对齐
    drawHL1->setAlignment(Qt::AlignTop);                       //  顶对齐
    drawHL1->setContentsMargins(0,0,0,0);				     //  四边距为0
    drawHL1->setSpacing(0);                                  //  内部控件间距为0

    // 下面这一段代码主要用于设计一个QToolButton类型的按钮控件，并把它添加到布局中
    QToolButton *pointTB = new QToolButton;                     // 第一个控件，画点
    pointTB->setToolButtonStyle(Qt::ToolButtonIconOnly);        // 控件样式设计为只显示图标
    pointTB->setFixedSize(QSize(32,32));                         // 指定图标的大小为 32x32 像素
    pointTB->setText("Point");                                  // 同时也设置了控件的显示名称
    pointTB->setArrowType(Qt::NoArrow);                         // 设置为没有箭头显示
    const QIcon pointIcon = QIcon::fromTheme("Point", QIcon(":/icon/Target1.png")); //资源文件中的点图标
    pointTB->setIcon(pointIcon);                                // 把这个点的图标设置给QToolButton按钮
    connect(pointTB, &QToolButton::clicked, this, &MainWindow::pointTB_clicked); // 建立点击该按钮的槽函数的链接
    drawHL1->addWidget(pointTB);
        // 把这个按钮添加到布局中
    QToolButton *lineTB = new QToolButton;                     // 画线
    lineTB->setToolButtonStyle(Qt::ToolButtonIconOnly);        // 控件样式设计为只显示图标
    lineTB->setFixedSize(QSize(32,32));                         // 指定图标的大小为 32x32 像素
    lineTB->setText("Line");                                  // 同时也设置了控件的显示名称
    lineTB->setArrowType(Qt::NoArrow);                         // 设置为没有箭头显示
    const QIcon linetIcon = QIcon::fromTheme("Line", QIcon(":/icon/Line.png")); // 资源文件中的线的图标
    lineTB->setIcon(linetIcon);                                // 把这个点的图标设置给QToolButton按钮
    connect(lineTB,&QToolButton::clicked,this,&MainWindow::lineTB_clicked);   // 建立点击该按钮的槽函数的链接
    drawHL1->addWidget(lineTB);

    QToolButton *circleTB =new QToolButton;
    circleTB->setToolButtonStyle(Qt::ToolButtonIconOnly);        // 控件样式设计为只显示图标
    circleTB->setIconSize(QSize(32,32));                         // 指定图标的大小为 32x32 像素
    circleTB->setText("Circle");                                  // 同时也设置了控件的显示名称
    circleTB->setArrowType(Qt::NoArrow);                         // 设置为没有箭头显示
    circleTB->setPopupMode(QToolButton::MenuButtonPopup);
    const QIcon circleIcon = QIcon::fromTheme("Circle", QIcon(":/icon/Circle.png"));   // 这是资源文件中的点的图标
    circleTB->setIcon(circleIcon);                                // 把这个点的图标设置给QToolButton按钮

    QMenu * circleMenu = new QMenu;               // 为以叠加图标，需要构建菜单再添加动作
    QAction * cirAct1 = new QAction(QIcon(":/icon/Circle.png"),"圆心半径");
    QAction * cirAct2 = new QAction(QIcon(":/icon/Circle.png"),"两点画圆");
    QAction * cirAct3 = new QAction(QIcon(":/icon/Circle.png"),"三点画圆");
    circleMenu->addAction(cirAct1);
    circleMenu->addAction(cirAct2);
    circleMenu->addAction(cirAct3);
    circleTB->setMenu(circleMenu);              		// 把菜单添加到QToolButton
    connect(cirAct1,&QAction::triggered,this,&MainWindow::cirAct1_triggered);
    drawHL1->addWidget(circleTB);

    QToolButton *RectangleTB = new QToolButton;                     // 矩形
    RectangleTB->setToolButtonStyle(Qt::ToolButtonIconOnly);        // 控件样式设计为只显示图标
    RectangleTB->setFixedSize(QSize(32,32));                         // 指定图标的大小为 32x32 像素
    RectangleTB->setText("Rectangle");                                  // 同时也设置了控件的显示名称
    RectangleTB->setArrowType(Qt::NoArrow);                         // 设置为没有箭头显示
    const QIcon RectangleIcon = QIcon::fromTheme("Rectangle", QIcon(":/icon/Square.png")); //资源文件中的点图标
    RectangleTB->setIcon(RectangleIcon);                                // 把这个点的图标设置给QToolButton按钮
    connect(RectangleTB, &QToolButton::clicked, this, &MainWindow::RectangleTB_clicked); // 建立点击该按钮的槽函数的链接
    drawHL1->addWidget(RectangleTB);

    QHBoxLayout *drawHL = new QHBoxLayout;
    drawHL->setAlignment(Qt::AlignLeft);
    drawHL->setAlignment(Qt::AlignTop);
    drawHL->setContentsMargins(0,0,0,0);



    // 最后，把DrawTab的布局设计成刚才创建的布局
    ui->DrawTab->setLayout(drawHL1);
    // 最后，把DrawTab的布局设计成刚才创建的布局

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::pointTB_clicked()
{
    curDrawType = Dpoint;
}
void MainWindow::lineTB_clicked()
{
    curDrawType = DLine;
}
void MainWindow::cirAct1_triggered()
{
    curDrawType = DCircle;
}
void MainWindow::RectangleTB_clicked()
{
    curDrawType = DRectangle;
}
void MainWindow::on_actionExit_triggered()
{
    this->close();   //  退出窗口应用程序
}


void MainWindow::on_actionNew_triggered()
{
    int ret = QMessageBox::warning(this, "Warning",
                                   "你的图形是否保存?",
                                   QMessageBox::Ok | QMessageBox::Cancel);
    if(ret == QMessageBox::Ok)
        m_MainList.clear();
}


void MainWindow::on_actionOpen_triggered()
{
    QString curPath = QDir::currentPath();   // 获得当前程序所在的目录
    QString aFileName = QFileDialog::getOpenFileName(this,"选择一个图形文件",curPath,"CAD文件(*.*)");
    if(!aFileName.isEmpty())
        qDebug()<<"把文件内容读入到m_MainList中";
}


void MainWindow::on_actionSave_triggered()
{
    QString curPath = QDir::currentPath();
    QString aFileName = QFileDialog::getSaveFileName(this,"输入一个图形文件名称",curPath,"CAD文件(*.*)");
    if(!aFileName.isEmpty())
        qDebug()<<"把m_MainList中的对象写入到 : "<< aFileName;
}


void MainWindow::on_actionSaveAs_triggered()
{
    QString curPath = QDir::currentPath();
    QString aFileName = QFileDialog::getSaveFileName(this,"输入一个图形文件名称",curPath,"CAD文件(*.*)");
    if(!aFileName.isEmpty())
        qDebug()<<"把m_MainList中的对象写入到 : "<< aFileName;
}

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if(curDrawType == DLine)
    {
        if(isFirst)
        {
            temppt = event->pos();
            isFirst = false;
        }
        else
        {
            DwgLine *line = new DwgLine;            // 创建并初始化一个直线对象
            line->SetData(temppt,event->pos());		// 使用SetData函数设置私有成员变量
            mObjVec.append(line);				// append函数用于把对象添加到数组mLines中
            update();						// 该函数用于刷新窗口
            isFirst = true;
        }
    }
    if(curDrawType == DCircle)
    {
        if(isFirst)
        {
            temppt = event->pos();
            isFirst = false;
        }
        else
        {
            DwgCircle *circle = new DwgCircle;            // 创建并初始化一个直线对象
            circle->SetData(temppt,event->pos());		// 使用SetData函数设置私有成员变量
            mObjVec.append(circle);                     // append函数用于把对象添加到数组mLines中
            update();                                   // 该函数用于刷新窗口
            isFirst = true;
        }
    }
    if(curDrawType == DRectangle)
    {
        if(isFirst)
        {
            temppt = event->pos();
            isFirst = false;
        }
        else
        {
            DwgRectangle *rectangle = new DwgRectangle;            // 创建并初始化一个直线对象
            rectangle->SetData(temppt,event->pos());		// 使用SetData函数设置私有成员变量
            mObjVec.append(rectangle);				// append函数用于把对象添加到数组mLines中
            update();				// 该函数用于刷新窗口
            isFirst = true;
        }
    }
    if(curDrawType == Dpoint)
    {

        DwgPoint* temppt = new DwgPoint;
        *temppt = event->pos();
        mObjVec.append(temppt);

        update();
    }
}

void MainWindow::paintEvent(QPaintEvent *event)
{
    m_painter = new QPainter(this);
    for(auto& i : mObjVec)
        i->Draw(m_painter);
}

